package cn.tedu.practice;

import java.util.Arrays;
import java.util.Objects;

public class TestString {
    public static void main(String[] args) {
//        Student s1 = new Student();
//        Student s2 = new Student("海绵宝宝",3);
//        Student s3 = new Student("海绵宝宝",3);
//
//        System.out.println(s1.hashCode());
//        System.out.println(s2.hashCode());
//        System.out.println(s3.hashCode());
//
//        System.out.println(s1);//Object中的toString()的默认实现：对象的名字@十六进制的哈希码值
//        System.out.println(s2);//重写toString()之后，打印的是对象类型+属性+属性值
//        System.out.println(s3);
//
//        System.out.println(s1.equals(s2));//Obnject中的equals()默认实现使用的是==比较，基本类型比较的是字面值，引用类型比较的是地址值
//        System.out.println(s2.equals(s3));//重写equals()和hashCode()以后，比较的就是对象的类型+属性+属性值
//        /**重写之前，哈希码值根据地址值生成，equals比较的是两个对象的地址值
//         * 重写之后，哈希码值根据重写后传入的对象的属性生成，equals比较的是两个对象的类型+属性+属性值*/
//        //1.字符串类型底层维护的是char[] ，分配一个新的String，表示字符数组参数中当前包含的字符序列
//        char[] value = {'a','b','c'};
//        String s1 = new String(value);
//        String s11 = new String(value);
//        //第一次使用字符串，java会在字符堆常量池中创建一个对象，再次使用相同对象时，会直接访问堆中常量池中存在的对象
//        String s2 = "abc";
//        String s22 = "abc";
//        String s3 = "ccc";
//        System.out.println(s1 == s2);//false.s1在堆里，s2在堆中常量池
//        System.out.println(s1 == s11);//false，都在堆里，地址值不同，是两个不同的对象
//        System.out.println(s2 == s22);//true，都在堆中常量池，内容相同，指向同一个地址值
//        System.out.println(s2 == s3);//false，都在堆中常量池，内容不相同，指向不同地址值
//
//        //String底层已经重写了toString()和equals(),所以比较的是两个字符串的具体内容
//
//        System.out.println(s1.equals(s11));//true
//        System.out.println(s1.equals(s2));//true
//        System.out.println(s2.equals(s3));//false

//        char[] value ={'a','b','c'};
//        String s1 = new String(value);
//        String s2 = "abc";
//
//        //Stirng重写了hashCode()，是根据字符串的内容生成哈希码值，而不是地址值
//        System.out.println(s1.hashCode() == s2.hashCode());
//        System.out.println(s1 == s2);//false，一个在堆中，一个在常量池中
//
//        System.out.println(s1.length());
//        System.out.println(s1.toUpperCase());
//        System.out.println(s1.toLowerCase());
//        System.out.println(s1.startsWith("b"));
//        System.out.println(s1.endsWith("c"));
//        System.out.println(s1.charAt(0));
//
//        String s3 = "abcdaabbccddef";
//        System.out.println(Arrays.toString(s3.split("a")));
//        String[] a = s3.split("b");
//        for (int i = 0; i < a.length; i++) {
//            System.out.println(a[i]);
//        }
//
//        String s4 = "    hh   hhhh     ";
//        System.out.println(s4.trim());
//
//        String s7 = "abcdefgh";
//        System.out.println(s7.substring(3));
//        System.out.println(s7.substring(3,6));
//
//        String s = String.valueOf(10);
//        System.out.println(s+10);
//
//        byte[] bs = s7.getBytes();
//        System.out.println(Arrays.toString(bs));
        String s ="abcdefg";
//        method1(s);
        method2(s);
    }

    private static void method2(String s) {
        StringBuffer sb = new StringBuffer();
        StringBuilder sb2 = new StringBuilder();
        long t1 = System.currentTimeMillis();
        for (int i = 1; i <=10 ; i++) {
//            sb.append(s);
            sb2.append(s);
        }
        System.out.println(sb2);
        long t2 = System.currentTimeMillis();
        System.out.println(t2 - t1);
    }

    private static void method1(String s) {
        String ss = "";
        long t1 = System.currentTimeMillis();
        for (int i = 1;i <=10; i++){
            ss+=s;
        }
        System.out.println(ss);
        long t2 = System.currentTimeMillis();
        System.out.println(t2-t1);
    }


}

class Student{
    String name;
    int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
